package com.itheima.springbootwebtlias.controller;

import com.itheima.springbootwebtlias.commons.CurrentHolder;
import com.itheima.springbootwebtlias.pojo.Dept;
import com.itheima.springbootwebtlias.pojo.Result;
import com.itheima.springbootwebtlias.service.DeptService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 *部门处理器： 处理部门相关请求
 */
/**
 *  @RequestMapping
 *   作用：设置请求路径
 *   位置：方法上，类上
 *   处理器类中：一个完整的请求路径是  处理器类上的路径 + 方法上路径
 */
@Slf4j   //lombok提供的功能注解：自动生成日志对象Logger  log
@RequestMapping("/depts")
@RestController
public class DeptController {

    //创建日志对象Logger
    //private static final Logger log = LoggerFactory.getLogger(DeptController.class);

    @Autowired
    private DeptService deptService;

    //查询所有部门列表的处理器方法
    //@RequestMapping(value="/depts", method = RequestMethod.GET)
    @GetMapping //标识该方法处理请求地址为/depts的GET请求
    public Result queryAll(HttpServletRequest request, HttpServletResponse response) {

        log.info("通知：queryAll目标方法... ...");

        log.info("过滤器，目标资源QueryAll... ...");
        //1.接收请求参数：无
        log.info("查询所有部门列表，请求参数：无");
        //2.调用业务层Service的功能方法，查询部门列表
        List<Dept> depts = deptService.selectAll();

        log.info("查询所有部门列表，查询完毕：{}",depts);
        //3.封装响应结果
        return Result.success(depts);
    }

    //删除指定部门处理器方法
    /*@DeleteMapping("/depts")
    public Result removeById(HttpServletRequest request, @RequestParam(value = "id",required = true,defaultValue = "10")Integer id2, Dept dept, @RequestParam Map map){
        //1.接收请求数据：k = v
        //方式一：原始的方式HttpServletRequest (不推荐)
        String idStr = request.getParameter("id");
        int id = Integer.parseInt(idStr);
        System.out.println("HttpServletRequest接收参数：" + id);

        //方式二：框架，直接定义变量接收(请求参数数量 较少)
        System.out.println("接收到请求参数："+id2);

        //方式三：框架，直接定义对象接收(请求参数数量 较多)
        System.out.println("接收到请求参数：" + dept);

        //方式四：框架，定义Map对象（请求参数数量 较多 + 没有现成的实体对象，不想单独创建实体对象接收）   注意：@RequestParam标识使用当前集合接收请求参数
        System.out.println("定义Map对象接收参数：" + map.get("id"));
        //2.调用业务层Service的功能方法，删除指定部门
        //3.封装响应结果
        return null;
    }*/

    //删除指定部门处理器方法
    @DeleteMapping
    public Result removeById(Integer id){
        //1.接收请求参数：k = v
        //直接定义变量接收：变量名称 = 参数名称一致
        log.info("删除指定部门，请求参数：{}",id);
        //2.调用业务层Service的功能方法，删除指定部门
        deptService.removeById(id);//DML不需要返回值

        //3.封装响应结果：
        return Result.success(); //code=1,data=null,msg="success"
    }

    //添加部门处理器方法
    @PostMapping
    public Result save(@RequestBody  Dept dept){
        log.info("controller save,当前线程：{}, {}",Thread.currentThread().getName(), CurrentHolder.getCurrentId());
        //1.接收请求参数：json（请求体中）
        //json接收参数：@RequestBody + 定义实体对象/Map对象
        log.info("添加部门，请求参数：{}",dept);

        //2.调用业务层Service的功能方法，添加部门
        deptService.saveDept(dept);
        //3.封装响应结果
        return Result.success(); //code = 1,msg = success,data = null
    }


    // 根据id查询部门处理器方法
    /*@GetMapping("/depts/{id}/{name}/{age}")
    public Result findById(@PathVariable int id, @PathVariable String name, @PathVariable int age) {
        // 1、接收请求参数：path路径参数，作为请求路径一部分
        // 请求路径参数接收方式：@PathVariable 定义变量
        System.out.println("请求路径参数：" + id);
        System.out.println("请求路径参数：" + name);
        System.out.println("请求路径参数：" + age);
        // 2、调用业务层Service的功能方法，查询指定部门
        // 3、封装响应结果
        return null;
    }*/

    @GetMapping("/{id}")
    public Result findById(@PathVariable int id) {
        // 1、接收请求参数：path路径参数，作为请求路径一部分
        // 请求路径参数接收方式：@PathVariable 定义变量
        log.info("根据id查询部门，请求参数：" + id);

        // 2、调用业务层Service的功能方法，查询指定部门
        Dept dept = deptService.findById(id);

        log.info("根据id查询部门，查询结果：{}",dept);
        // 3、封装响应结果
        return Result.success(dept);//code = 1,msg = success,data = 查询到部门详情信息
    }

    //修改部门处理器方法
    @PutMapping
    public Result update(@RequestBody Dept dept){
        //1.接收请求参数: json(请求体中)
        //JSON格式参数: @RequestBody + 定义实体对象 / Map对象
        log.info("修改部门，请求参数：{}",dept);

        //2.调用业务层Service的功能方法，修改部门
        deptService.update(dept);

        //3.封装响应结果
        return Result.success(); //code=1,msg=success,data=null
    }
}
